package com.time.thread.threadLocal;

/**
 * @program: tes
 * @description:线程局部变量
 * 解释1：ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法，当我们在创建一个变量后，
 * 如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。
 * ThreadLocal是JDK包提供的，它提供线程本地变量，如果创建一乐ThreadLocal变量，
 * 那么访问这个变量的每个线程都会有这个变量的一个副本，在实际多线程操作的时候，
 * 操作的是自己本地内存中的变量，从而规避了线程安全问题。
 * @author: xuejingjing
 * @create: 2021-10-22 13:53
 **/

/**
 * 解释2：threadlocal是一个线程内部的存储类，可以在指定线程内存储数据，数据存储以后，只有指定线程可以得到存储数据。
 * 大致意思就是ThreadLocal提供了线程内存储变量的能力，这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。
 * 通过get和set方法就可以得到当前线程对应的值。
 * 做个不恰当的比喻，从表面上看ThreadLocal相当于维护了一个map，key就是当前的线程，value就是需要存储的对象。
 */

/**
 * ThreadLocal和Synchronized的区别（明白）：
 * ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题，不同的点是
 * Synchronized是通过线程等待，牺牲时间来解决访问冲突。
 * ThreadLocal是通过每个线程单独一份存储空间，牺牲空间来解决冲突，并且相比于Synchronized，
 * ThreadLocal具有线程隔离的效果，只有在线程内才能获取到对应的值，线程外则不能访问到想要的值。
 *
 */

public class ThreadLocalTest {
    static ThreadLocal<String> localVar = new ThreadLocal<>();
    static void print(String str){
        //打印当前线程中本地变量的值
        System.out.println(str + ":" +localVar.get());
        //清除本地内存中的本地变量
        localVar.remove();
    }
}
